[小ネタ]Cloud Functionsをデプロイする際にentry-pointのエラーが出る場合の対処
はじめに
CX事業本部東京オフィスの佐藤智樹です。
今回は以前行ったGCPのCloud Functionsのチュートリアルで関数をデプロイする際にentry-pointのエラーが出た場合の原因確認と対処方法を記載します。前の記事と同じようにエラー文から原因推測が難しかったので、同じように悩んでいる人がすぐに解決できるようにと自分の備忘録のために記事にします。
発生するエラー
Cloud Functionsで以下のコマンドでファイル内のprocess_image関数をhandlerとして指定しデプロイする際にエラーが発生しました。
ファイル(一部抜粋)
import base64 import json import os from google.cloud import pubsub_v1 from google.cloud import storage from google.cloud import translate from google.cloud import vision … def process_image(file, context): bucket = validate_message(file, 'bucket') name = validate_message(file, 'name') detect_text(bucket, name) print('File {} processed.'.format(file['name'])) …
実行したコマンド
gcloud functions deploy ocr-extract --runtime python37 --trigger-bucket 2020xxxx-cloudfunctions-ocr-image --entry-point process_image
出力されたエラー
Deploying function (may take a while - up to 2 minutes)...failed. ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function failed on loading user code. Error message: File main.py is expected to contain a function named process_image
原因
エラー文から見るとentry-pointの名称誤りかentry-point内部の関数が怪しいように見えますが問題ありませんでした。問題を切り分けるため地道にコードを削除してデプロイを繰り返すうちに以下のコード部分があるとデプロイできないことが分かりました。
from google.cloud import translate
調べたところCloud Translation APIは現在だとv2とv3が提供されています。明確には見つけられなかったですが、上記のソースでインポートしているv1は使用できなくなっているようです。
Python Client for Google Cloud Translation — google-cloud-translate documentation
対処方法
以下のようにv2のライブラリをインポートすることで問題なくデプロイできるようになります。互換性があったので翻訳も問題なく動作しました。
from google.cloud import translate_v2 as translate
感想
単純な内容ですがentry-point以外の部分に問題があると気付かず無駄に時間を取られました。(シリコンバレー見ながら試してたせいでもありますが)Serverless Frameworkなどを使えばもっと分かりやすくエラーが出るのか調べてみたいです。検索しても同じエラーに関する記事は出てこなかったので誰かのためになれば幸いです。